package mx.ipn.presentacion.telefonista;

import java.util.Arrays;
import java.util.HashMap;

import com.trolltech.qt.gui.*;

import mx.ipn.presentacion.ConexionConNegocios;
import mx.ipn.presentacion.Utilerias;
import mx.ipn.presentacion.telefonista.ui.*;
import mx.ipn.to.*;

public class ABCDireccion extends QWidget {
	Ui_Direcciones ui = new Ui_Direcciones();

	// Relaciona el id del elemento con el indice del comboBox
	HashMap<Integer, Integer> mapaMunicipios = new HashMap<Integer, Integer>();
	HashMap<Integer, Integer> mapaColonias = new HashMap<Integer, Integer>();
	HashMap<Integer, Integer> mapaCalles = new HashMap<Integer, Integer>();
	HashMap<Integer, Integer> mapaColoniaCalle = new HashMap<Integer, Integer>();
	HashMap<Integer, Integer> mapaDirecciones = new HashMap<Integer, Integer>();

	// Banderas para alertar de algun cambio en los comboBoxes
	boolean isEstadoChanged = false;
	boolean isMunicipioChanged = false;
	boolean isColoniaChanged = false;
	boolean isCalleChanged = false;
	boolean isDireccionChanged = false;

	ABCDireccion() {
		ui.setupUi(this);

		// conecta las señales de los botones <Siguiente> y <Anterior>
		ui.pushButtonAnterior.clicked.connect(this, "pasoAnterior()");
		ui.pushButtonSiguiente.clicked.connect(this, "pasoSiguiente()");

		// conecta las señales de cambio de indice con una bandera para alertar
		// el cambio
		ui.comboBoxEstado.currentIndexChanged.connect(this, "indiceCambiado()");
		ui.comboBoxMunicipio.currentIndexChanged.connect(this,
				"indiceCambiado()");
		ui.comboBoxColoniaCP.currentIndexChanged.connect(this,
				"indiceCambiado()");
		ui.comboBoxCalle.currentIndexChanged.connect(this, "indiceCambiado()");
		ui.comboBoxNumeroInteriorEntreCalles.currentIndexChanged.connect(this,
				"indiceCambiado()");
		
		// conecta las señales para cambiar campos
		ui.pushButtonCambiarCalle.clicked.connect(this, "modificarCalle()");
		ui.pushButtonCambiarColoniaCP.clicked.connect(this,"modificarColoniaCP()");
		ui.pushButtonCambiarEstado.clicked.connect(this,"modificarEstado()");
		ui.pushButtonCambiarMunicipio.clicked.connect(this,"modificarMunicipio()");
		ui.pushButtonCambiarNumeroInteriorEntreCalles.clicked.connect(this,"modificarDireccion()");
		
		// conecta las señales para cambiar campos
		ui.pushButtonNuevoCalle.clicked.connect(this, "agregarCalle()");
		ui.pushButtonNuevoColoniaCP.clicked.connect(this,"agregarColoniaCP()");
		ui.pushButtonNuevoEstado.clicked.connect(this,"agregarEstado()");
		ui.pushButtonNuevoMunicipio.clicked.connect(this,"agregarMunicipio()");
		ui.pushButtonNuevoNumeroInteriorEntreCalles.clicked.connect(this,"agregarDireccion()");
		
		// checar
		ui.pushButtonFinalizar.clicked.connect(this, "close()");
		ui.pushButtonCancelar.clicked.connect(this, "close()");
	}

	ABCDireccion(QWidget parent) {
		ui.setupUi(this);
	}

	// Agrega un nuevo Estado a la BD
	void agregarEstado(){
		EstadoTO estadoTO = new EstadoTO();
		
		estadoTO.setNombre(ui.lineEditEstado.text());
		
		TransferObject resp = (TransferObject) ConexionConNegocios.invocaServicio(
				"agregarEstado", estadoTO, TransferObject.class);
		
		if (resp.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp);
		
		llenarEstados();
	}
	
	// Modificar el Estado seleccionado
	void modificarEstado(){
		EstadoTO estadoTO = new EstadoTO();
		
		estadoTO.setIdEstado((short)(ui.comboBoxEstado.currentIndex() + 1));
		estadoTO.setNombre(ui.lineEditEstado.text());
		
		TransferObject resp = (TransferObject) ConexionConNegocios.invocaServicio(
				"modificarEstado", estadoTO, TransferObject.class);
		
		if (resp.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp);
		
		llenarEstados();
	}
	
	void agregarMunicipio(){
		EstadoTO estadoTO = new EstadoTO();
		MunicipioTO municipioTO = new MunicipioTO();
		
		estadoTO.setIdEstado((short)(ui.comboBoxEstado.currentIndex() + 1));

		municipioTO.setNombre(ui.lineEditMunicipio.text());
		municipioTO.setEstadoTO(estadoTO);
		
		TransferObject resp = (TransferObject) ConexionConNegocios.invocaServicio(
				"agregarMunicipio", municipioTO, TransferObject.class);
		
		if (resp.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp);
		
		llenarMunicipios();
	}
	
	void modificarMunicipio(){
		EstadoTO estadoTO = new EstadoTO();
		MunicipioTO municipioTO = new MunicipioTO();
		
		estadoTO.setIdEstado((short)(ui.comboBoxEstado.currentIndex() + 1));

		municipioTO.setIdMunicipio(mapaMunicipios
				.get(ui.comboBoxMunicipio.currentIndex()));
		municipioTO.setNombre(ui.lineEditMunicipio.text());
		municipioTO.setEstadoTO(estadoTO);
		
		TransferObject resp = (TransferObject) ConexionConNegocios.invocaServicio(
				"modificarMunicipio", municipioTO, TransferObject.class);
		
		if (resp.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp);
		
		llenarMunicipios();
	}
		
	void agregarColoniaCP(){
		MunicipioTO municipioTO = new MunicipioTO();
		ColoniaTO coloniaTO = new ColoniaTO();
		
		municipioTO.setIdMunicipio(mapaMunicipios
				.get(ui.comboBoxMunicipio.currentIndex()));

		coloniaTO.setNombre(ui.lineEditColonia.text());
		coloniaTO.setCodigoPostal(ui.lineEditCodigoPostal.text());
		coloniaTO.setMunicipioTO(municipioTO);
		
		TransferObject resp = (TransferObject) ConexionConNegocios.invocaServicio(
				"agregarColonia", coloniaTO, TransferObject.class);
		
		if (resp.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp);
		
		llenarColonias();
	}

	void modificarColoniaCP(){
		MunicipioTO municipioTO = new MunicipioTO();
		ColoniaTO coloniaTO = new ColoniaTO();
		
		municipioTO.setIdMunicipio(mapaMunicipios
				.get(ui.comboBoxMunicipio.currentIndex()));

		coloniaTO.setIdColonia(mapaColonias
				.get(ui.comboBoxColoniaCP.currentIndex()));
		coloniaTO.setNombre(ui.lineEditColonia.text());
		coloniaTO.setCodigoPostal(ui.lineEditCodigoPostal.text());
		coloniaTO.setMunicipioTO(municipioTO);
		
		TransferObject resp = (TransferObject) ConexionConNegocios.invocaServicio(
				"modificarColonia", coloniaTO, TransferObject.class);
		
		if (resp.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp);
		
		llenarColonias();
	}
	
	// Agregar una nueva Calle
	void agregarCalle() {
		CalleTO calleTO = new CalleTO();
		
		calleTO.setNombre(ui.lineEditCalle.text());
		
		CalleTO resp = (CalleTO) ConexionConNegocios.invocaServicio(
				"agregarCalle", calleTO, CalleTO.class);
		
		if (resp.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp);
		
		// Agregar la relacion Colonia - Calle
		
		ColoniaCalleTO coloniaCalleTO = new ColoniaCalleTO();

		coloniaCalleTO.setIdCalle(resp.getIdCalle());
		coloniaCalleTO.setIdColonia(mapaColonias
				.get(ui.comboBoxColoniaCP.currentIndex()));
		
		TransferObject resp2 = (TransferObject) ConexionConNegocios.invocaServicio(
				"agregarColoniaCalle", coloniaCalleTO, TransferObject.class);
		
		if (resp2.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp2);
		
		llenarCalles();
	}
	
	void modificarCalle() {
		CalleTO calleTO = new CalleTO();

		calleTO.setIdCalle(mapaCalles
				.get(ui.comboBoxCalle.currentIndex()));
		calleTO.setNombre(ui.lineEditCalle.text());
		
		TransferObject resp = (TransferObject) ConexionConNegocios.invocaServicio(
				"modificarCalle", calleTO, TransferObject.class);
		
		if (resp.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp);
		
		llenarCalles();
	}
	
	void agregarDireccion(){
		DireccionTO direccionTO = new DireccionTO();
		ColoniaCalleTO coloniaCalleTO = new ColoniaCalleTO();
		
		coloniaCalleTO.setIdColoniaCalle(mapaColoniaCalle.get(ui.comboBoxCalle.currentIndex()));
		
		direccionTO.setNumero(ui.lineEditNumero.text());
		direccionTO.setInterior(ui.lineEditInterior.text());
		direccionTO.setEntreCalles(ui.lineEditEntreCalles.text());
		direccionTO.setOtrasReferencias(ui.lineEditOtrasReferencias.text());
		direccionTO.setColoniaCalleTO(coloniaCalleTO);
		
		TransferObject resp = (TransferObject) ConexionConNegocios.invocaServicio(
				"agregarDireccion", direccionTO, TransferObject.class);
		
		if (resp.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp);
		
		llenarDirecciones();
	}
	
	void modificarDireccion(){
		DireccionTO direccionTO = new DireccionTO();
		ColoniaCalleTO coloniaCalleTO = new ColoniaCalleTO();
		
		coloniaCalleTO.setIdColoniaCalle(mapaColoniaCalle.get(ui.comboBoxCalle.currentIndex()));
		
		direccionTO.setIdDireccion(mapaDirecciones
				.get(ui.comboBoxNumeroInteriorEntreCalles.currentIndex()));
		direccionTO.setNumero(ui.lineEditNumero.text());
		direccionTO.setInterior(ui.lineEditInterior.text());
		direccionTO.setEntreCalles(ui.lineEditEntreCalles.text());
		direccionTO.setOtrasReferencias(ui.lineEditOtrasReferencias.text());
		direccionTO.setColoniaCalleTO(coloniaCalleTO);
		
		TransferObject resp = (TransferObject) ConexionConNegocios.invocaServicio(
				"modificarDireccion", direccionTO, TransferObject.class);
		
		if (resp.getTipoError() > 0)
			Utilerias.mostrarMensajeError(this, resp);
		
		llenarDirecciones();
	}
	
	// Cuando den click en el boton <Anterior>
	void pasoAnterior() {
		// no se puede finalizar el asistente
		ui.pushButtonFinalizar.setEnabled(false);
		// se puede avanzar
		ui.pushButtonSiguiente.setEnabled(true);

		// se cambia el indice
		ui.stackedWidget.setCurrentIndex(ui.stackedWidget.currentIndex() - 1);

		// si es el primero, no se puede retroceder
		if (ui.stackedWidget.currentIndex() == 0)
			ui.pushButtonAnterior.setEnabled(false);
	}

	// <Siguiente>
	void pasoSiguiente() {
		ui.pushButtonAnterior.setEnabled(true);
		ui.stackedWidget.setCurrentIndex(ui.stackedWidget.currentIndex() + 1);

		if (ui.stackedWidget.currentIndex() == ui.stackedWidget.count() - 1) {
			ui.pushButtonFinalizar.setEnabled(true);
			ui.pushButtonSiguiente.setEnabled(false);
		}

		// llena los comboBoxes dependiendo de la pagina anterior
		llenarComboBoxes(ui.stackedWidget.currentIndex());
	}

	void llenarEdicionEstado() {
		ui.lineEditEstado.setText(ui.comboBoxEstado.currentText());
	}

	void llenarEdicionMunicipio() {
		ui.lineEditMunicipio.setText(ui.comboBoxMunicipio.currentText());
	}

	void llenarEdicionColonia() {
		// saca la colonia del combo ColoniaCodigoPostal
		String coloniaCP = ui.comboBoxColoniaCP.currentText();
		String colonia = coloniaCP.substring(0, coloniaCP.indexOf(','));
		ui.lineEditColonia.setText(colonia);

		// saca el CP
		String cp = coloniaCP.substring(coloniaCP.indexOf(',') + 2);
		ui.lineEditCodigoPostal.setText(cp);
	}

	void llenarEdicionCalle() {
		ui.lineEditCalle.setText(ui.comboBoxCalle.currentText());
	}

	void llenarEdicionDireccion() {
		// De direccion va sacando sus elementos buscando con substrings las
		// comas para diferenciarlos
		String direccion = ui.comboBoxNumeroInteriorEntreCalles.currentText();
		String numero = direccion.substring(1, direccion.indexOf(','));
		ui.lineEditNumero.setText(numero);

		int indice = direccion.indexOf("interior:");

		if (indice == -1) {
			ui.lineEditInterior.clear();
		} else {
			String interior = direccion.substring(indice + 10);
			ui.lineEditInterior.setText(interior.substring(0, interior
					.indexOf(",")));
		}

		indice = direccion.indexOf("entre calles:");

		if (indice == -1) {
			ui.lineEditEntreCalles.clear();
		} else {
			String entreCalles = direccion.substring(indice + 14);

			int indiceComa = entreCalles.indexOf(',');
			if (indiceComa == -1)
				ui.lineEditEntreCalles.setText(entreCalles);
			else
				ui.lineEditEntreCalles.setText(entreCalles.substring(0,
						indiceComa));
		}

		indice = direccion.indexOf("otras referencias:");

		if (indice == -1) {
			ui.lineEditOtrasReferencias.clear();
		} else {
			ui.lineEditOtrasReferencias.setText(direccion
					.substring(indice + 19));
		}

	}

	// alerta de cambios
	void indiceCambiado() {
		switch (ui.stackedWidget.currentIndex()) {
		case 1:
			isEstadoChanged = true;
			// llena los lineEdits de Edicion del Estado actual
			llenarEdicionEstado();
			break;
		case 2:
			isMunicipioChanged = true;
			llenarEdicionMunicipio();
			break;
		case 3:
			isColoniaChanged = true;
			llenarEdicionColonia();
			break;
		case 4:
			isCalleChanged = true;
			llenarEdicionCalle();
			break;
		case 5:
			isDireccionChanged = true;
			llenarEdicionDireccion();
			break;
		}
	}

	// llena el comboBox de Estado
	void llenarEstados() {
		// se borran los estados actuales del comboBox
		ui.comboBoxEstado.clear();

		// se obtienen todos los estados de la BD
		EstadoTO[] estados = (EstadoTO[]) ConexionConNegocios.invocaServicio(
				"obtenerEstados", EstadoTO[].class);

		// se agregan los estados al comboBox
		for (EstadoTO e : estados)
			ui.comboBoxEstado.addItem(e.getNombre());
	}

	// llena el comboBox de Municipio
	void llenarMunicipios() {
		ui.comboBoxMunicipio.clear();

		// se obtienen los municipios relacionados con el estado
		// seleccionado en la pagina anterior
		MunicipioTO municipioTO = (MunicipioTO) ConexionConNegocios
				.invocaServicio("obtenerMunicipiosPorEstado",
						(short) ui.comboBoxEstado.currentIndex() + 1,
						MunicipioTO.class);

		// se obtienen los arreglos del Transfer Object
		Integer[] idMun = municipioTO.getListIdMunicipio();
		String[] municipios = municipioTO.getListNombre();

		// se agregan los municipios al comboBox y se relaciona en un
		// HashMap el indice del comboBox con el id del Municipio
		for (int i = 0; i < idMun.length; i++) {
			ui.comboBoxMunicipio.addItem(municipios[i]);
			mapaMunicipios.put(i, idMun[i]);
		}
	}

	// llena el comboBox de Colonias
	void llenarColonias() {
		ui.comboBoxColoniaCP.clear();

		ColoniaTO coloniaTO = (ColoniaTO) ConexionConNegocios.invocaServicio(
				"obtenerColoniasPorMunicipio", mapaMunicipios
						.get(ui.comboBoxMunicipio.currentIndex()),
				ColoniaTO.class);

		Integer[] id = coloniaTO.getListIdColonia();
		String[] colonias = coloniaTO.getListNombre();
		String[] cp = coloniaTO.getListCodigoPostal();

		for (int i = 0; i < colonias.length; i++) {
			ui.comboBoxColoniaCP.addItem(colonias[i] + ", " + cp[i]);
			mapaColonias.put(i, id[i]);
		}
	}

	// llena el comboBox de Calles
	void llenarCalles() {
		ui.comboBoxCalle.clear();

		ColoniaCalleTO coloniaCalleTO = (ColoniaCalleTO) ConexionConNegocios
				.invocaServicio("obtenerCallesPorColonia", mapaColonias
						.get(ui.comboBoxColoniaCP.currentIndex()),
						ColoniaCalleTO.class);

		CalleTO[] calles = coloniaCalleTO.getListCalleTO();
		Integer[] ids = coloniaCalleTO.getListIdColiniaCalle();

		// Calle necesita dos HashMaps, el de idCalles para hacer cambios a
		// una Calle, y el de idColoniaCalle para obtener los datos de la
		// siguiente pagina
		for (int i = 0; i < calles.length; i++) {
			ui.comboBoxCalle.addItem(calles[i].getNombre());
			mapaCalles.put(i, calles[i].getIdCalle());
			mapaColoniaCalle.put(i, ids[i]);
		}

	}

	// llena el comboBox de Direcciones
	void llenarDirecciones() {
		ui.comboBoxNumeroInteriorEntreCalles.clear();

		System.out.println("id ColCalle: "
				+ mapaColoniaCalle.get(ui.comboBoxCalle.currentIndex()));

		DireccionTO direccionTO = (DireccionTO) ConexionConNegocios
				.invocaServicio("obtenerDireccionesPorColoniaCalle",
						mapaColoniaCalle.get(ui.comboBoxCalle.currentIndex()),
						DireccionTO.class);

		Integer[] idsDireccion = direccionTO.getListIdDireccion();
		String[] numeros = direccionTO.getListnumero();
		String[] interiores = direccionTO.getListInterior();
		String[] otrasReferencias = direccionTO.getListOtrasReferencias();
		String[] entreCalles = direccionTO.getListEntreCalles();

		for (int i = 0; i < idsDireccion.length; i++) {
			String elemento = new String();

			if (numeros[i] != null)
				elemento += "#" + numeros[i];
			if (interiores != null)
				elemento += ", interior: " + interiores[i];
			if (entreCalles != null)
				elemento += ", entre calles: " + entreCalles[i];
			if (otrasReferencias != null)
				elemento += ", otras referencias: " + otrasReferencias[i];

			ui.comboBoxNumeroInteriorEntreCalles.addItem(elemento);
			mapaDirecciones.put(i, idsDireccion[i]);
		}
	}

	// llena los lineEdits de la visualizacion previa de la direccion
	void llenarDireccionFinal() {
		ui.lineEditEstadoFinal.setText(ui.comboBoxEstado.currentText());

		ui.lineEditMunicipioFinal.setText(ui.comboBoxMunicipio.currentText());

		// saca la colonia del combo ColoniaCodigoPostal
		String coloniaCP = ui.comboBoxColoniaCP.currentText();
		String colonia = coloniaCP.substring(0, coloniaCP.indexOf(','));
		ui.lineEditColoniaFinal.setText(colonia);

		// saca el CP
		String cp = coloniaCP.substring(coloniaCP.indexOf(',') + 2);
		ui.lineEditCodigoPostalFinal.setText(cp);

		ui.lineEditCalleFinal.setText(ui.comboBoxCalle.currentText());

		// De direccion va sacando sus elementos buscando con substrings las
		// comas para diferenciarlos
		String direccion = ui.comboBoxNumeroInteriorEntreCalles.currentText();
		String numero = direccion.substring(1, direccion.indexOf(','));
		ui.lineEditNumeroFinal.setText(numero);

		int indice = direccion.indexOf("interior:");

		if (indice > -1) {
			String interior = direccion.substring(indice + 10);
			ui.lineEditInteriorFinal.setText(interior.substring(0, interior
					.indexOf(",")));
		} else
			ui.lineEditInteriorFinal.clear();

		indice = direccion.indexOf("entre calles:");

		if (indice > -1) {
			String entreCalles = direccion.substring(indice + 14);

			int indiceComa = entreCalles.indexOf(',');
			if (indiceComa == -1)
				ui.lineEditEntreCallesFinal.setText(entreCalles);
			else
				ui.lineEditEntreCallesFinal.setText(entreCalles.substring(0,
						indiceComa));
		} else
			ui.lineEditEntreCallesFinal.clear();

		indice = direccion.indexOf("otras referencias:");

		if (indice > -1) {
			ui.lineEditOtrasReferenciasFinal.setText(direccion
					.substring(indice + 19));
		} else
			ui.lineEditOtrasReferenciasFinal.clear();
	}

	// llena los elementos del stackWidget para la pagina en cuestion
	void llenarComboBoxes(int pagina) {
		switch (pagina) {

		// para la pagina de Estado
		case 1:
			llenarEstados();
			break;

		// Municipio
		case 2:
			// si se cambio el Estado en la pagina anterior
			if (isEstadoChanged)
				llenarMunicipios();
			isEstadoChanged = false;
			break;

		// Colonia CP
		case 3:
			if (isMunicipioChanged)
				llenarColonias();
			isMunicipioChanged = false;
			break;

		// Calle
		case 4:
			if (isColoniaChanged)
				llenarCalles();
			isColoniaChanged = false;
			break;

		// Numero, interior, entre calles
		case 5:
			if (isCalleChanged)
				llenarDirecciones();
			isCalleChanged = false;
			break;

		// La previsualizacion de la calle
		case 6:
			if (isDireccionChanged)
				llenarDireccionFinal();
			isDireccionChanged = false;
			break;
		}
	}
}
